#include "canfifoack.h"
#include "bsp_can1.h"
/**
 * @brief CAN 发送，添加应答机制，如果发出的数据没有应答成功就会自动重发
 * 
 */
static void Set_Ack_Flag(void);
static void Clear_Ack_Flag(void);
static uint8_t Get_Ack_Flag(void);
static void CanFifoSendMessage(void);

static uint8_t can_ack_flag = 0;
static void Set_Ack_Flag(void)
{
    can_ack_flag = 1;
}

static void Clear_Ack_Flag(void)
{
    can_ack_flag = 0;
}

static uint8_t Get_Ack_Flag(void)
{
	return can_ack_flag;
}

static uint8_t can_buf[8] = {0},s_can_id = 0;
/**
 * @brief 将要发送的CAN数据放入缓存
 * 
 * @param ID 
 * @param buf 
 */
void CanFifoBufferPush(uint16_t ID, uint8_t* buf)
{
	for(uint8_t i=0;i<8;i++)
	{
		can_buf[i]=buf[i];
	}
	s_can_id = ID;
	Set_Ack_Flag();//设置需要应答
}

/**
 * @brief 检测应答是否完成，此函数得放在CAN接收中断里面执行
 * 
 * @param buf 
 */
void Canfifo_ack_check(uint8_t *buf)
{
    if(buf[0]=='C'&& buf[1]=='A'&& buf[2]=='N'&& buf[3]=='O'&& buf[4]=='K')
    {
        Clear_Ack_Flag();//标记应答完成
    }
}
/**
 * @brief 定时发送数据出去，此函数应以一定周期运行
 * 
 */
void Canfifoack_process(void)
{
	if(Get_Ack_Flag()){//还没应答成功
        CanFifoSendMessage();
	}
}
/**
 * @brief 发送数据接口
 * 
 */
static void CanFifoSendMessage(void)
{
	CAN1_TX_PACKET(s_can_id,can_buf,8);
}


